package cn.com.bluemoon.daps.sync.core.sync.compare;

import cn.com.bluemoon.daps.common.sql.IDbDataSource;
import cn.com.bluemoon.daps.sync.base.CompareResult;
import cn.com.bluemoon.daps.sync.core.sync.Tuple2;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 定义两组数据进行对比
 *
 * @author Jarod.Kong
 * @date 2021/1/14 9:17
 */
@FunctionalInterface
public interface IComparator<T extends IDbDataSource, R> {
    /**
     * 定义两组数据进行对比
     *
     * @param oldT v1
     * @param newT v2
     * @return 定义两组数据进行对比返回对比差异结果
     */
    List<CompareResult<R>> compare(T oldT, T newT);

    /**
     * 本地接口方法，针对list<tuple2<T>>进行转换为oldT,newT进行对比，整合输出结果
     *
     * @param v1AndV2Dbs dbs
     * @return 定义两组数据进行对比
     */
    default List<CompareResult<R>> compares(List<Tuple2<T>> v1AndV2Dbs) {
        if (v1AndV2Dbs != null) {
            return v1AndV2Dbs.stream().flatMap(v1AndV2Db -> compare(v1AndV2Db.getOldT(), v1AndV2Db.getNewT()).stream()).collect(Collectors.toList());
        }
        return Collections.emptyList();
    }
}
